﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Polendamus.Interfaces;
using System.Web.Routing;
using Polendamus.Repositories;
using Polendamus.Models;
using Polendamus.Enums;

namespace Polendamus.Controllers
{
    [HandleError]
    public class HomeController : BaseController
    {
        public IProvinciasRep provinciasrepository { get; set; }
        public IAlergiasRep alergiasrepository { get; set; }
        public INivelesRep nivelesrepository { get; set; }
        public IBocadillosRep bocadillosrepository { get; set; }
        public IDibujosRep dibujosrepository { get; set; }
        public IPrediccionesRep prediccionesrepository { get; set; }

        protected override void Initialize(RequestContext requestContext)
        {
            if (provinciasrepository == null)
            {
                provinciasrepository = new ProvinciasRepository();
            }
            if (alergiasrepository == null)
            {
                alergiasrepository = new AlergiasRepository();
            }
            if (nivelesrepository == null)
            {
                nivelesrepository = new NivelesRepository();
            }
            if (bocadillosrepository == null)
            {
                bocadillosrepository = new BocadillosRepository();
            }
            if (dibujosrepository == null)
            {
                dibujosrepository = new DibujosRepository();
            }
            if (prediccionesrepository == null)
            {
                prediccionesrepository = new PrediccionesRepository();
            }

            base.Initialize(requestContext);
        }
        public ActionResult Index()
        {
            using (polendamusEntities dbContext = GetNewDBContext())
            {
                provinciasrepository.DBContext = dbContext;
                alergiasrepository.DBContext = dbContext;
                bocadillosrepository.DBContext = dbContext;
                dibujosrepository.DBContext = dbContext;

                //Rellenamos el modelo con los textos iniciales
                PolenModel model = new PolenModel();

                model.Bocadillo1 = GetRandomNivelFrase(ValoresPolen.Inicio);
                model.Bocadillo2 = GetRandomPrediccionFrase(ValoresPrediccion.Inicio);

                ViewData["ImgPersona1"] = "polen medio 1 persona 1.png";
                ViewData["ImgPersona2"] = "polen medio 1 persona 2.png";

                List<Provincias> provincias = provinciasrepository.GetProvincias().ToList();
                ViewData["Provincias"] = provincias;

                //List<Alergias> alergias = alergiasrepository.GetAlergias().Where(a=>a.Nombre=="Gramineas"||a.Nombre=="Platanus").ToList();
                List<Alergias> alergias = alergiasrepository.GetAlergias().ToList();
                ViewData["Alergias"] = alergias;
                model.Provincia = provincias.FirstOrDefault().Nombre;
                model.Alergia = alergias.FirstOrDefault().Nombre;
                ViewData.Model = model;
                return View();
            }
        }

        [HttpPost]
        public ActionResult Index(PolenModel model)
        {
            using (polendamusEntities dbContext = GetNewDBContext())
            {
                provinciasrepository.DBContext = dbContext;
                alergiasrepository.DBContext = dbContext;
                nivelesrepository.DBContext = dbContext;
                prediccionesrepository.DBContext = dbContext;
                bocadillosrepository.DBContext = dbContext;
                dibujosrepository.DBContext = dbContext;

                List<Provincias> provincias = provinciasrepository.GetProvincias().ToList();
                List<Alergias> alergias = alergiasrepository.GetAlergias().ToList();
                
                Provincias provincia = provinciasrepository.GetProvinciaByName(model.Provincia);
                Alergias alergia = alergiasrepository.GetAlergiasByName(model.Alergia);
                Niveles NivelHoy = nivelesrepository.GetNivelesByProvByAlergia(provincia.Id, alergia.Id);
                Predicciones Prediccion = prediccionesrepository.GetPrediccionByIdProvincia(provincia.Id);

                ViewData["Provincias"] = provincias;

                ViewData["Alergias"] = alergias;

                //TODO Mensaje con el que rellenar los bocadillos
                if (NivelHoy != null)
                {
                    model.Bocadillo1 = GetRandomNivelFrase(int.Parse(NivelHoy.Estado));
                    model.Bocadillo2 = GetRandomNivelFrase(int.Parse(Prediccion.Estado));
                    ViewData["ImgPersona1"] = GetRandomNivelDibujo(1);
                    ViewData["ImgPersona2"] = GetRandomPrediccionDibujo(1);
                }
                else
                {
                    model.Bocadillo1 = "No hay datos";
                    model.Bocadillo2 = "No hay datos";
                    ViewData["ImgPersona1"] = "polen medio 1 persona 1.png";
                    ViewData["ImgPersona2"] = "polen medio 1 persona 2.png";
                }

                ViewData.Model = model;
                return View();
            }
        }

        public ActionResult About()
        {
            return View();
        }

        #region Frases y Dibujos Aleatorios
        private String GetRandomNivelFrase(int nivel)
        {
            String frase = "";
            String nivelTexto = nivel.ToString();
            List<Bocadillos> listaFrases = bocadillosrepository.GetBocadillos().Where(g => g.EsHoy == true && g.Estado.Equals(nivelTexto)).ToList();
            Random r = new Random((int)DateTime.Now.Ticks * 20);
            int digito;
            switch (nivel)
            {
                case ValoresPolen.Inicio:
                    digito = r.Next(0, Constantes.CantidadFrasesDibujos.numFrasesNivelesInicio);
                    frase = listaFrases.ToArray()[digito].Texto;
                    break;
                case ValoresPolen.Nulo:
                    digito = r.Next(0, Constantes.CantidadFrasesDibujos.numFrasesNivelesNulo);
                    frase = listaFrases.ToArray()[digito].Texto;
                    break;
                case ValoresPolen.Bajo:
                    digito = r.Next(0, Constantes.CantidadFrasesDibujos.numFrasesNivelesBajo);
                    frase = listaFrases.ToArray()[digito].Texto;
                    break;
                case ValoresPolen.Medio:
                    digito = r.Next(0, Constantes.CantidadFrasesDibujos.numFrasesNivelesMedio);
                    frase = listaFrases.ToArray()[digito].Texto;
                    break;
                case ValoresPolen.Alto:
                    digito = r.Next(0, Constantes.CantidadFrasesDibujos.numFrasesNivelesAlto);
                    frase = listaFrases.ToArray()[digito].Texto;
                    break;
                case ValoresPolen.MuyAlto:
                    digito = r.Next(0, Constantes.CantidadFrasesDibujos.numFrasesNivelesMuyAlto);
                    frase = listaFrases.ToArray()[digito].Texto;
                    break;
                default:
                    break;
            }

            return frase;
        }

        private String GetRandomNivelDibujo(int nivel)
        {
            //Hacemos un sleep para que no se repita los numeros aleatorios generados.
            //System.Threading.Thread.Sleep(30);
            Random r = new Random((int)DateTime.Now.Ticks * 20);
            int digito;
            switch (nivel)
            {
                case ValoresPolen.Nulo:
                    digito = r.Next(0, Constantes.CantidadFrasesDibujos.numDibujosNivelesNulo);
                    break;
                case ValoresPolen.Bajo:
                    digito = r.Next(0, Constantes.CantidadFrasesDibujos.numDibujosNivelesBajo);
                    break;
                case ValoresPolen.Medio:
                    digito = r.Next(0, Constantes.CantidadFrasesDibujos.numDibujosNivelesMedio);
                    break;
                case ValoresPolen.Alto:
                    digito = r.Next(0, Constantes.CantidadFrasesDibujos.numDibujosNivelesAlto);
                    break;
                case ValoresPolen.MuyAlto:
                    digito = r.Next(0, Constantes.CantidadFrasesDibujos.numDibujosNivelesMuyAlto);
                    break;
                default:
                    break;
            }

            return "";
        }

        private String GetRandomPrediccionFrase(int nivel)
        {
            String frase = "";
            String nivelTexto = nivel.ToString();
            List<Bocadillos> listaFrases = bocadillosrepository.GetBocadillos().Where(g => g.EsHoy == false && g.Estado.Equals(nivelTexto)).ToList();
            Random r = new Random((int)DateTime.Now.Ticks * 20);
            int digito;
            switch (nivel)
            {
                case ValoresPrediccion.Inicio:
                    digito = r.Next(0, Constantes.CantidadFrasesDibujos.numFrasesPrevisionInicio);
                    frase = listaFrases.ToArray()[digito].Texto;
                    break;
                case ValoresPrediccion.Baja:
                    digito = r.Next(0, Constantes.CantidadFrasesDibujos.numFrasesPrevisionBaja);
                    frase = listaFrases.ToArray()[digito].Texto;
                    break;
                case ValoresPrediccion.Mantiene:
                    digito = r.Next(0, Constantes.CantidadFrasesDibujos.numFrasesPrevisionMantiene);
                    frase = listaFrases.ToArray()[digito].Texto;
                    break;
                case ValoresPrediccion.Sube:
                    digito = r.Next(0, Constantes.CantidadFrasesDibujos.numFrasesPrevisionSube);
                    frase = listaFrases.ToArray()[digito].Texto;
                    break;
                default:
                    break;
            }
            return frase;
        }

        private String GetRandomPrediccionDibujo(int nivel)
        {
            Random r = new Random((int)DateTime.Now.Ticks * 20);
            int digito;
            switch (nivel)
            {
                case ValoresPrediccion.Baja:
                    digito = r.Next(0, Constantes.CantidadFrasesDibujos.numDibujosPrevisionBaja);
                    break;
                case ValoresPrediccion.Mantiene:
                    digito = r.Next(0, Constantes.CantidadFrasesDibujos.numDibujosPrevisionMantiene);
                    break;
                case ValoresPrediccion.Sube:
                    digito = r.Next(0, Constantes.CantidadFrasesDibujos.numDibujosPrevisionSube);
                    break;
                default:
                    break;
            }
            return "";
        }

        #endregion
    }
}
